// 配置通用的接口调用方法
import axios from 'axios'
import router from "../router/index.js";
import {ElMessage, ElNotification} from "element-plus";
import store from "../store/index.js";

// 配置基准路径
export const baseURL = import.meta.env.VITE_BASE_URL

export const baseUrlForWebSocket = import.meta.env.VITE_BASE_WS

// 此时instance实例和axios类似
const instance = axios.create({
    // 设置超时时间
    timeout: 5000,
    // 设置基准的接口请求路径
    baseURL: baseURL
})

// 请求拦截器：统一添加请求头Token
instance.interceptors.request.use((config) => {
    // 如果已经登录，发送请求时携带token信息
    const token = localStorage.getItem("token")
    if (token != null) {
        // 已经登录，添加请求头
        config.headers.Authorization = 'Bearer ' + token
    }
    return config
}, (err) => {
    return Promise.reject(err)
})

// 响应拦截器:1、对后端返回的数据进行处理；2、处理token失效的问题
instance.interceptors.response.use((res) => {

    if (res.headers.has("New-Token")) {
        // 注意这两行的顺序，先清空在设置
        store.commit('clearAllUserData')
        localStorage.setItem("token", res.headers.get("New-Token"))
        store.state.isLogin = true
        instance({
            method: 'get',
            url: '/api/uaa/user/_'
        })
            .then(resp => {
                console.log("router card resp")
                console.log(resp)
                let data = resp.data
                if (data.code === 0) {
                    store.commit('saveUserData', data.data)
                } else {
                    ElNotification({
                        title: "获取信息失败",
                        message: "请尝试重新登录！",
                        type: "error"
                    })
                }
            })
            .catch(err => {
                console.log('router card err')
                console.log(err)
            })
    }

    return res
}, (err) => {
    // 判断token是否失效
    if (err.response)
        if (err.response.status === 401) {
            // token失效了，清空用户信息，跳转到登录页面
            store.commit('clearAllUserData')
            ElMessage.warning('请登录！')
            return router.push('/login')
        } else if (err.response.status === 403) {
            return router.push('/403')
        } else {
            ElMessage.error('出现未知错误')
            console.log(err)
        }
    return Promise.reject(err)
})

// 封装通用的调用后端接口的方法
export default (options) => {
    return instance(options)
    // axios返回的结果是Promise实例对象
    // return instance({
    //     method: options.method,
    //     url: options.url,
    //     // data: options.data
    //     // 对象的key可以是动态变量（ES6提供的规则）
    //     // toUpperCase方法的作用：把小写字符串转换为大写
    //     [options.method.toUpperCase() === 'GET' ? 'params' : 'data']: options.data
    // })
}